<?php
// +----------------------------------------------------------------------
// | HkCms 应用中心
// +----------------------------------------------------------------------
// | Copyright (c) 2012-2019 http://www.hkcms.cn, All rights reserved.
// +----------------------------------------------------------------------
// | Author: 广州恒企教育科技有限公司 <admin@hkcms.cn>
// +----------------------------------------------------------------------

namespace libs\system;

// =====Api 说明======
// get.license 获取授权信息，参数 domain=网站域名
// get.competence 判断帐号权限是否正常
// get.latestversion 获取最新版本号，无参数
// get.notice 远程通知
// 模块
// get.module.list 获取在线模块列表信息，参数 page=当前第几页，默认1，paging=每页显示数量
// get.module.info 获取某个模块的信息，参数 sign=模块签名
// get.module.latestversion 获取某个模块的最新版本号，参数 sign=模块签名，sign为数组时，返回多个
// get.module.install.package.url 获取某个模块的安装包地址，参数 sign=模块签名
// get.module.upgrade.package.url 获取某个模块的升级包地址，参数 sign=模块签名，version=安装版本
// get.module.explanation 获取模块的使用/安装说明，参数 sign=模块签名
// 插件
// get.addons.list 获取在线插件列表信息，参数 page=当前第几页，默认1，paging=每页显示数量
// get.addons.info 获取某个插件的信息，参数 name=插件标识
// get.addons.install.package.url 获取某个插件的安装包地址，参数 name=插件标识
// get.addons.upgrade.package.url 获取某个模块的升级包地址，参数 name=插件标识，version=安装版本
// get.addons.explanation 获取插件的使用/安装说明，参数 name=插件标识

class Cloud {

    //错误信息
    private $error = '出现未知错误 Cloud ！';
    //需要发送的数据
    private $data = array();
    //接口
    private $act = NULL;
    private $token = NULL;

    //应用服务器地址
    const appServerHot = 'http://addon.hkcms.cn/api/';
    const serverHot = 'http://api.hkcms.cn/index.php/cloud';

    /**
     * 连接云平台系统
     * @access public
     * @return object
     */
    static public function getInstance() {
        static $systemHandier;
        if (empty($systemHandier)) {
            $systemHandier = new Cloud();
        }
        return $systemHandier;
    }

    /**
     * 获取错误信息
     * @return string
     */
    public function getError() {
        return $this->error;
    }

    /**
     * 需要发送的数据
     * @param array $data
     * @return \Libs\System\Cloud
     */
    public function data($data) {
        $this->data = $data;
        return $this;
    }

    /**
     * 执行对应命令
     * @param string $act 例如 version.detection
     * @return mixed
     */
    public function act($act) {
        if (empty($this->data)) {
            $data = null;
        } else {
            $data = $this->data;
            //重置，以便下一次服务请求
            $this->data = array();
        }
        $this->act = $act;
        return $this->run($data);
    }

    /**
     * 检测当前站点云端帐号密码是否正常
     * @return boolean
     */
    public function competence() {
        $key = $this->getTokenKey();
        $token = config($key);
        if (empty($token)) {
            $this->act('get.token');
            $token = config($key);
        }
        $this->token = $token;
        return true;
    }

    /**
     * 请求
     * @param array $data
     * @return mixed
     */
    private function run($data) {
        $curl = new \libs\util\Curl();
        $fields = array(
            'data' => json_encode($data),
            'version' => HKCMS_VERSION,
            'act' => $this->act,
            'identity' => $this->getIdentity(),
            'token' => $this->token,
        );
        //curl支持 检测
        if ($curl->create() == false) {
            $this->error = '服务器不支持Curl扩展！';
            return false;
        }
        //请求
        $status = $curl->post(self::serverHot, $fields);

        if (false == $status) {
            $this->error = '无法联系服务器，请稍后再试！';
            return false;
        }
        return $this->returnResolve($status);
    }

    /**
     * 解析服务器返回的数据
     * @param string $data
     * @return mixed
     */
    private function returnResolve($data) {
        if (empty($data)) {
            return array();
        }
        $data = json_decode(base64_decode($data), true);
        if (!is_array($data) || !isset($data['status'])) {
            $this->error = '服务器返回信息错误！';
            return false;
        }
        if (!$data['status']) {
            $this->error = $data['error'];
            return false;
        }

        return $data['data'];
    }

    /**
     * 获取token Key
     * @return string
     */
    public function getTokenKey() {
        return md5(date('Y-m-d H') . 'cloud_token');
    }

    /**
     * hkCMS开放平台帐号
     * @return mixed
     */
    private function getIdentity() {
        $arr = array(
            'domain' => urlDomain(get_url()),
        );
        if (!session('cloud_token')) {
            $arr['username'] = config('cloud_username');
            $arr['password'] = config('cloud_password');
        }
        return json_encode($arr);
    }

    public function appCenter($data,$url)
    {
        $curl = new \libs\util\Curl();
        if ($curl->create() == false) { //curl支持 检测
            $this->error = '服务器不支持Curl扩展！';
            return false;
        }

        // 检测Token是否过期
        if (session('appCenter_token')) {
            $status = $curl->post(self::appServerHot.'token/check', [],'', ['token:'.session('appCenter_token.token')]);
            if (empty($status)) {
                session('appCenter_token',null);
            }
            $userInfo = json_decode($status, true);
            if (empty($userInfo['code']) || $userInfo['code']!=1) {
                session('appCenter_token',null);
            }
        }
        if (!session('appCenter_token')) { // 没有登录的情况下发起登录操作
            $user = config('cloud_username');
            $pass = config('cloud_password');
            if (empty($user) || empty($pass)) {
                $this->error = '请在设置里填写应用中心账号！';
                return false;
            }
            $accountData['account'] = $user;
            $accountData['password'] = $pass;
            $status = $curl->post(self::appServerHot.'user/login', $accountData);
            if (empty($status)) {
                $this->error = '登录失败';
            }
            $userInfo = json_decode($status, true);
            if (empty($userInfo['code']) || $userInfo['code']!=1 || empty($userInfo['data'])) {
                $this->error = '错误信息：【'.isset($userInfo['msg'])?$userInfo['msg']:'未知错误'.'】';
            }
            session('appCenter_token',$userInfo['data']['userinfo']);
        }

        $status = $curl->post(self::appServerHot.$url, $data,'',['token:'.session('appCenter_token.token')]);
        $status = json_decode($status, true);
        if (!empty($status['code']) && $status['code']==1) {
            return $status['data'];
        } else {
            $this->error = !empty($status['msg'])?$status['msg']:'获取数据失败';
            return false;
        }
    }
}
